/*
 *  Copyright 2001-2004 The Apache Software Foundation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package ar.uba.fi.posgrado.economy.service;

import java.util.List;

import ar.uba.fi.posgrado.academy.model.Teacher;
import ar.uba.fi.posgrado.common.exception.MissingArgumentException;
import ar.uba.fi.posgrado.common.exception.PosgradoException;
import ar.uba.fi.posgrado.common.exception.PosgradoRuntimeException;
import ar.uba.fi.posgrado.common.service.GenericService;
import ar.uba.fi.posgrado.economy.exception.PayRuleException;
import ar.uba.fi.posgrado.economy.model.CollectType;
import ar.uba.fi.posgrado.economy.model.Pay;

/**
 * Servicio para {@link Pay egresos /pagos} y {@link CollectType tipos de cobro}.<br>
 * 
 * @author nicolas.gonzalez
 * 
 * @see GenericService
 */
public interface PayService extends GenericService<Pay> {

	/**
	 * Busca los {@link CollectType}s
	 * 
	 * @return
	 * @throws PosgradoRuntimeException
	 * @throws PosgradoException
	 */
	public List<CollectType> getAllCollectTypes()
			throws PosgradoRuntimeException, PosgradoException;

	/**
	 * Busca el {@link CollectType} por id
	 * 
	 * @param collectTypeId
	 * @return
	 * @throws PosgradoRuntimeException
	 * @throws PosgradoException
	 */
	public CollectType getCollectTypeById(Long collectTypeId)
			throws PosgradoRuntimeException, PosgradoException;

	/**
	 * Aplica ciertas reglas:<br>
	 * <ul>
	 * <li>Si el valor del pago es menor q el del honorario asociado entonces
	 * falla.</li>
	 * <li>Si el valor del pago es mayor q el del honorario, entonces falla.</li>
	 * </ul>
	 * <br>
	 * Siempre se modifica el estado del honorario.<br>
	 * <br>
	 * 
	 * Se actualiza la cuenta corriente modificando la deuda total.<br>
	 * 
	 * @see ar.uba.fi.posgrado.common.service.GenericService#create(java.lang.Object)
	 */
	public void create(Pay pay) throws MissingArgumentException,
			PayRuleException, PosgradoException;

	/**
	 * Operacion <b>NO PERMITIDA</b>.<br>
	 * No se pueden modificar los pagos.<br>
	 * Arroja un PayRuleException <b>SIEMPRE</b>.<br>
	 * <br>
	 * 
	 * @see ar.uba.fi.posgrado.common.service.GenericService#update(java.lang.Object)
	 */
	public Pay update(Pay pay) throws PosgradoRuntimeException,
			PayRuleException, PosgradoException;

	/**
	 * Operacion <b>NO PERMITIDA</b>.<br>
	 * No se pueden eliminar los pagos.<br>
	 * Arroja un PayRuleException <b>SIEMPRE</b>.<br>
	 * <br>
	 * 
	 * @see ar.uba.fi.posgrado.common.service.GenericService#delete(java.lang.Object)
	 */
	public void delete(Pay pay) throws PosgradoRuntimeException,
			PayRuleException, PosgradoException;

	/**
	 * Devuelve una lista de {@link Pay pagos} por cualquiera de los atributos
	 * del pago recibido por parametro.<br>
	 * <br>
	 * 
	 * <b>Importante: </b> Los resultados estan ordenados por el docente y la
	 * fecha.<br>
	 * <br>
	 * 
	 * La fecha se usa como Menor o Igual.<br>
	 * 
	 * @param pay
	 * @return
	 * @throws PosgradoRuntimeException
	 * @throws PosgradoException
	 */
	public List<Pay> getPaysByConditions(Pay pay)
			throws PosgradoRuntimeException, PosgradoException;

	public List<Pay> getPaysByTeacher(Teacher teacher)
			throws PosgradoRuntimeException, PosgradoException;

}
